/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetbi_parsing;

import java.util.List;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import projetbi_dao.DAOClient;
import projetbi_dao.DAOEnvTechMission;
import projetbi_dao.DAOFonction;
import projetbi_dao.DAOSuiviEtPositionnement;
import projetbi_objets.OClient;
import projetbi_objets.OCompetenceFonctionnelle;
import projetbi_objets.OCompetenceTechnique;
import projetbi_objets.ODiplome;
import projetbi_objets.ODomaineCompetence;
import projetbi_objets.OEnvTechMission;
import projetbi_objets.OFonction;
import projetbi_objets.OLangueCollaborateur;
import projetbi_objets.OSuiviEtPositionnement;
import tools.XLSXReader;

/**
 * Projet BI - M2 FIC 2012-2013
 *
 * @author Jef, Tuan-Long, William, Mohamed
 */
public class StringPatternMatching {

    public StringPatternMatching() {
    }

    // La formation n'est pas donnée dans le CV.
    public String spm_getS4OAptitudeFormation(String entryText) {
        String res = new String();
        String pattern1 = new String();
        String pattern2 = new String();
        return res;
    }

    // Renvoie le métier de la personne ( la deuxième ligne ).
    public String spm_getS4OCollaborateur_TitreProfil(String entryText) {
        String[] lines = entryText.split("\n");

        return lines[1].replaceAll("\t", "");
    }

    // Renvoie la disponibilité de la personne.
    public int spm_getI4OCollaborateur_Disponibilite(String entryText) {
        // On va chercher à déterminer si le collaborateur est disponible ou
        // pas. Pour ce faire, on a deux méthodes :
        // - Détecter "à ce jour" dans l'expérience professionnelle
        // - Détecter si la date de la dernière expérience correspond au mois en cours
        int res_dispo = 0;

        // Détection de "à ce jour"
        String sACeJour = new String("à ce jour");

        if (entryText.toLowerCase().contains(sACeJour.toLowerCase())) {
            res_dispo = 1;
        }

        return res_dispo;
    }

    // Récupère la synthèse de carrière
    public int spm_getI4OCollaborateur_AnneesExp(String entryText) {
        int resI = 0;
        String resS = new String();
        String pattern1 = new String("Synthèse de carrière :");
        String pattern2 = new String("d’expérience");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText);

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            resS += textInBetween;
        }
        // Suppression de l'espace
        resS.replaceAll("\\s", "");

        // Récupération de l'entier
        resI = Integer.parseInt(resS.replaceAll("[\\D]", ""));
        return resI;
    }

    // Récupère le prénom du collaborateur du CV en cours
    public String[] spm_getS4OCollaborateur_NomPrenom(String entryText) {
        String[] lines = entryText.split("\n");

        String[] words = lines[0].split(" ");
        return words;
    }

    // Récupère le secteur d'activité du collaborateur
    public int spm_getI4OCollaborateur_SecteurActivite(String entryText) {
        String resS = new String();
        int resI = 0;
        String pattern1 = new String("sectorielle");
        String pattern2 = new String("Compétences");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replace("\n", "").replace("\r", ""));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            resS += textInBetween;
        }

        // Ligne de test, à virer
        //System.out.println("--- Secteur d'activité : " + resS);

        // Détection de "public", "privé", "public et privé"
        String sPrive = new String("privé");
        String sPublic = new String("public");

        if (resS.toLowerCase().contains(sPublic.toLowerCase())) {
            resI = 1;
        }
        if (resS.toLowerCase().contains(sPrive.toLowerCase())) {
            resI = 2;
        }

        return resI;
    }

    // Récupère un string avec toutes les compétences fonctionnelles
    public String spm_getS4OCompetencesFonctionnelles_Macro(String entryText) {
        String resS = new String();
        String pattern1 = new String("Compétences fonctionnelles");
        String pattern2 = new String("Compétences techniques");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replaceAll("(^ )|( $)", "")
                .replace("\n", ";").replace("\r", ";"));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            resS += textInBetween;
        }
        return resS.replaceAll("(^;)|(;$)", "");
    }

    // Récupère un string avec toutes les compétences techniques
    public String spm_getS4OCompetencesTechniques_Macro(String entryText) {
        String resS = new String();
        String pattern1 = new String("Compétences techniques");
        String pattern2 = new String("Historique");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replaceAll("(^ )|( $)", "")
                .replace("\n", ";").replace("\r", ";"));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            resS += textInBetween;
        }
        return resS.replaceAll("(^;)|(;$)", "");
    }

    // Récupère un string avec tous les domaines de compétence
    public String spm_getS4ODomainesCompetences_Macro(String entryText) {
        String resS = new String();
        String pattern1 = new String("Domaines de compétences");
        String pattern2 = new String("Diplômes et certifications");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replaceAll("(^ )|( $)", "")
                .replace("\n", ";").replace("\r", ";"));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            resS += textInBetween;
        }
        return resS.replaceAll("(^;)|(;$)", "").replaceAll("(^\\t)|(\\t$)", "");
    }

    // Récupère un string avec toutes les missions globales pour la table
    // de fait. Il faudra alors retraiter et reparser chaque morceau...
    public String spm_getS4LignesTDF_Macro(String entryText) {
        String resS = new String();

        String pattern1 = new String("Projet");
        //String pattern2 = new String("Projet|Page 1");
        String pattern2 = new String("Page 1");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replaceAll("(^ )|( $)", "")
                .replace("\n", " ").replace("\r", " "));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            // Ligne de test, à virer
            //System.out.println("--- textInBetween : " + textInBetween);
            resS += textInBetween;
        }
        return resS;
    }

    // Récupère les noms des missions, ainsi que les dates de début et de fin
    public String spm_getS4NomsMissions_Macro(String entryText) {
        String resS = new String();

        String pattern1 = new String("Historique de carrière");
        String pattern2 = new String("Synthèse de carrière");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replaceAll("(^ )|( $)", "")
                .replace("\n", "_").replace("\r", "_"));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            // Ligne de test, à virer
            //System.out.println("--- NomsMissions textInBetween : " + textInBetween);
            resS += textInBetween;
        }
        return resS.replaceAll("(^_)|(_$)", "");
    }

    // Récupère un string avec toutes les langues
    public String spm_getS4OLanguesCollaborateur_Macro(String entryText) {
        String resS = new String();
        String pattern1 = new String("Langues");
        String pattern2 = new String("Projet");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replace("\n", "").replace("\r", ""));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            resS += textInBetween;
        }

        // Suppression du premier espace
        //resS.replaceAll("\\s", "");
        return resS;
    }

    // Récupère un string avec tous les diplômes, il faudra les découper plus tard
    public String spm_getS4ODiplome_Macro(String entryText) {
        String res = new String();
        String pattern1 = new String("Diplômes et certifications");
        String pattern2 = new String("Langues");

        String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher = pattern.matcher(entryText.replace("\n", "").replace("\r", ""));

        while (matcher.find()) {
            String textInBetween = matcher.group(1);
            res += textInBetween;
        }

        return res;
    }

    // Attention : string1 ne doit pas être nul !
    public OLangueCollaborateur spm_createOLangueCollaborateur(String string1) {
        OLangueCollaborateur resOLC = new OLangueCollaborateur();

        if (string1 != null) {
            String[] languesCoupees;
            String delimiter1 = new String(":");
            languesCoupees = string1.split(delimiter1);

            // Ligne de test, à virer
            //System.out.println("--- string1 : " + string1);

            resOLC.setIdCollaborateur(1);
            resOLC.setIdlangueCollaborateur(0);
            resOLC.setLibelleLangue(languesCoupees[0].replaceAll("\\s", ""));
            resOLC.setNiveauLangue(languesCoupees[1].replaceAll("\\s", ""));

        }

        return resOLC;
    }

    // Attention : string1 ne doit pas être nul !
    public OCompetenceFonctionnelle spm_createOCompetenceFonctionnelle(String string1) {
        OCompetenceFonctionnelle resOCF = new OCompetenceFonctionnelle();

        if (string1 != null) {
            resOCF.setIdCollaborateur(1);
            resOCF.setIdcompetenceFonctionnelle(0);
            resOCF.setLibelleCompetenceF(string1);
        }

        return resOCF;
    }

    // Attention : string1 ne doit pas être nul !
    public OCompetenceTechnique spm_createOCompetenceTechnique(String string1) {
        OCompetenceTechnique resOCT = new OCompetenceTechnique();

        if (string1 != null) {
            resOCT.setIdCollaborateur(1);
            resOCT.setIdtechnoConnue(0);
            resOCT.setLibelleTechnoConnue(string1);
        }

        return resOCT;
    }

    // Attention : string1 ne doit pas être nul !
    public ODomaineCompetence spm_createODomaineCompetence(String string1) {
        ODomaineCompetence resODC = new ODomaineCompetence();

        if (string1 != null) {
            resODC.setIdCollaborateur(1);
            resODC.setIddomaineCompetence(0);
            resODC.setLibelleCompetence(string1);
        }

        return resODC;
    }

    // Attention : string1 ne doit pas être nul !
    public ODiplome spm_createODiplome(String string1) {
        ODiplome resOD = new ODiplome();

        if (string1 != null) {
            String[] diplomesCoupesNiveau1;
            String delimiter1 = new String(":");
            diplomesCoupesNiveau1 = string1.split(delimiter1);

            String[] diplomesCoupesNiveau2;
            String delimiter2 = new String("\\(");
            diplomesCoupesNiveau2 = diplomesCoupesNiveau1[0].split(delimiter2);

            String[] diplomesCoupesNiveau3;
            String delimiter3 = new String("\\)");
            diplomesCoupesNiveau3 = diplomesCoupesNiveau2[1].split(delimiter3);

            // Ligne de test, à virer
            //System.out.println("--- Intitulé diplôme : " + diplomesCoupesNiveau1[1].replaceAll("(^ )|( $)", ""));
            //System.out.println("--- Nom école : " + diplomesCoupesNiveau2[0]);
            //System.out.println("--- Annee : " + diplomesCoupesNiveau3[0]);

            resOD.setIdCollaborateur(1);
            resOD.setIdDiplome(0);
            resOD.setNomEcole(diplomesCoupesNiveau2[0]);
            resOD.setLibelleDiplome(diplomesCoupesNiveau1[1].replaceAll("(^ )|( $)", ""));
            resOD.setAnneeObtention(Integer.parseInt(diplomesCoupesNiveau3[0]));
        }

        return resOD;
    }

    // Méthode de création et d'injection d'une ligne de la table de fait à partir des
    // informations de chaque mission
    public void spm_creerEtInjecterUneLigneTDF(String missionFull,
            String infosMission,
            int idCol) {
        OSuiviEtPositionnement oLigneTDF = new OSuiviEtPositionnement();
        OSuiviEtPositionnement oLigneTDF2 = new OSuiviEtPositionnement();
        OFonction oFonction = new OFonction();
        OFonction oFonction2 = new OFonction();
        OClient oClient = new OClient();
        OClient oClient2 = new OClient();
        ClientCreator cCr = new ClientCreator();
        XLSXReader xlsxR = new XLSXReader();

        DAOFonction daOFonction = new DAOFonction();
        DAOSuiviEtPositionnement daOSuiviEtPositionnement = new DAOSuiviEtPositionnement();
        DAOClient daOClient = new DAOClient();
        DAOEnvTechMission daOEnvTechMission = new DAOEnvTechMission();

        String intituleDeLaMission = new String();
        String envTechMBrut = new String();
        ArrayList<OEnvTechMission> alEnvTechM = new ArrayList();

        if (missionFull != null) {
            // Découpage pour l'intitulé de la mission
            String[] missionCoupeeNiveau1;
            String delimiter1 = new String("Fonction");
            missionCoupeeNiveau1 = missionFull.split(delimiter1);

            intituleDeLaMission = missionCoupeeNiveau1[0].replaceAll("(^ )|( $)", "");

            // Découpage pour la fonction
            String[] missionCoupeeNiveau2;
            String delimiter2 = new String("Responsabilité");
            missionCoupeeNiveau2 = missionCoupeeNiveau1[1].split(delimiter2);

            oFonction.setIdfonction(0);
            oFonction.setLibelleFonction(missionCoupeeNiveau2[0].replaceAll("(^ )|( $)", "")
                    .replaceAll("(^\t)", ""));

            // Découpage pour l'environnement technique ( en brut )
            String[] missionCoupeeNiveau3;
            String delimiter3 = new String("Environnement technique");
            missionCoupeeNiveau3 = missionCoupeeNiveau2[1].split(delimiter3);

            envTechMBrut = missionCoupeeNiveau3[1].replaceAll("(^ )|( $)", "")
                    .replaceAll("(^\t)", "");

            // Création de l'objet fonction, et récupération du nouvel objet en vue de
            // l'attribution de l'id dans la table de fait
            oFonction2 = daOFonction.create(oFonction);

            // Création de l'objet client
            oClient = cCr.cCr_createClient(infosMission);
            oClient2 = daOClient.create(oClient);

            // Calcul du salaire, du nombre de jours travaillés,
            // et de la date de début et de fin
            ArrayList<String> grilleSalairesFull = xlsxR.xlsx_getArrayListFromFile(".\\FicheSalaires.xls");
            Iterator<String> iter_s = grilleSalairesFull.iterator();
            int onATrouveJob = 0;
            int salaireMensuelFull = 0;

            while (iter_s.hasNext()) {
                String tmp_line = iter_s.next();
                if (tmp_line.toLowerCase().contains(oFonction.getLibelleFonction().toLowerCase())) {
                    String[] xlsxLineCoupee;
                    String delimiterXLS = new String("\t");
                    xlsxLineCoupee = tmp_line.split(delimiterXLS);

                    String[] tmp_cutPoint;
                    String delimiterCutPoint = new String("\\.");
                    tmp_cutPoint = xlsxLineCoupee[3].split(delimiterCutPoint);
                    salaireMensuelFull = Integer.parseInt(tmp_cutPoint[0]);
                    onATrouveJob = 1;
                }
            }
            if (onATrouveJob == 0) {
                salaireMensuelFull = 1700;
            }

            // Salaire journalier, sur la base qu'il y a 21 jours ouvrés par mois
            // ( Soit 70% d'un mois de 30 jours )
            int SalaireJournalier = salaireMensuelFull / 30;

            // Durée de la mission
            String[] infosMCoupees;
            String delimiterIM = new String("_");
            infosMCoupees = infosMission.split(delimiterIM); // infosMCoupees[1] va représenter les
            // infos sur la durée de la mission

            int jourDebut = 1;
            int moisDebut = 1;
            int anneeDebut = 1;
            int jourFin = 1;
            int moisFin = 1;
            int anneeFin = 1;
            if (infosMCoupees[1].startsWith("De ")) {
                String[] splitDuree1;
                String delimiterSplitDuree1 = " ";
                splitDuree1 = infosMCoupees[1].split(delimiterSplitDuree1);
                moisDebut = spm_giveMonthNumber(splitDuree1[1]);
                anneeDebut = Integer.parseInt(splitDuree1[2]);
                moisFin = spm_giveMonthNumber(splitDuree1[4]);
                anneeFin = Integer.parseInt(splitDuree1[5]);
            } else {
                String[] splitDuree1;
                String delimiterSplitDuree1 = " ";
                splitDuree1 = infosMCoupees[1].split(delimiterSplitDuree1);
                moisDebut = spm_giveMonthNumber(splitDuree1[1]);
                anneeDebut = Integer.parseInt(splitDuree1[2]);
                moisFin = 6;
                anneeFin = 2013; // Il faut récupérer la date courante !
            }

            int nbJoursMission = 0;
            nbJoursMission = spm_giveDifferenceJours(jourDebut, moisDebut, anneeDebut, jourFin, moisFin, anneeFin);

            // Remplissage des informations dans la table de fait
            // Identifiants
            oLigneTDF.setIdSuiviEtPositionnement(0);
            oLigneTDF.setIdCollaborateur(idCol);
            oLigneTDF.setIdFonction(oFonction2.getIdfonction());
            oLigneTDF.setIdFormation(1);
            oLigneTDF.setIdClient(oClient2.getIdClient());
            // Champs textuels
            oLigneTDF.setIntituleProjet(intituleDeLaMission.replaceAll("(^ )|( $)", "").replaceAll("(^\t)|( $)", ""));
            // Données calculées
            oLigneTDF.setJourDebut(jourDebut);
            oLigneTDF.setMoisDebut(moisDebut);
            oLigneTDF.setAnneeDebut(anneeDebut);
            oLigneTDF.setJourFin(jourFin);
            oLigneTDF.setMoisFin(moisFin);
            oLigneTDF.setAnneeFin(anneeFin);
            oLigneTDF.setDureeMission(nbJoursMission);
            oLigneTDF.setSalaireMission((SalaireJournalier * nbJoursMission));

            // Ligne de test, à virer
            //System.out.println("--- missionCoupeeNiveau2[0] : " + missionCoupeeNiveau2[0]);
            //System.out.println("--- envTechMBrut : " + envTechMBrut);
            //System.out.println("--- salaireMensuelFull : " + salaireMensuelFull);
            //System.out.println("--- SalaireJournalier : " + SalaireJournalier);
            //System.out.println("--- infosMCoupees[1] : " + infosMCoupees[1]);
            //System.out.println("--- anneeFin : " + anneeFin);
            System.out.println("--- oLigneTDF.getSalaireMission() : " + oLigneTDF.getSalaireMission());

            // Création de la ligne et récupération de son id pour les environnements techniques
            // de la mission
            oLigneTDF2 = daOSuiviEtPositionnement.create(oLigneTDF);

            // Remplissage de l'ArrayList pour les environnements techniques de la mission
            String[] intermediaireALETM;
            String delimiterEnvTM = new String(",");
            intermediaireALETM = envTechMBrut.split(delimiterEnvTM);

            for (int iETM = 0; iETM < intermediaireALETM.length; iETM++) {
                if (!intermediaireALETM[iETM].equals("")) {
                    alEnvTechM.add(spm_createOEnvTechMission(intermediaireALETM[iETM],
                            oLigneTDF2.getIdSuiviEtPositionnement()));
                }
            }
            Iterator<OEnvTechMission> iter_oETM = alEnvTechM.iterator();
            while (iter_oETM.hasNext()) {
                OEnvTechMission oETMtmp = iter_oETM.next();
                daOEnvTechMission.create(oETMtmp);
            }
        }
    }

    // Attention : string1 ne doit pas être nul !
    public OEnvTechMission spm_createOEnvTechMission(String string1, int idSEP) {
        OEnvTechMission resOETM = new OEnvTechMission();

        if (string1 != null) {
            resOETM.setIntituleEnvTech(string1.replaceAll("(^ )|( $)", "")
                    .replaceAll("(^\t)", ""));
            resOETM.setIdTechnoUtiliseeMission(0);
            resOETM.setIdSuiviEtPositionnement(idSEP);
        }


        return resOETM;
    }

    // Donne un entier à partir du nom du mois
    public int spm_giveMonthNumber(String monthFull) {
        int resI = 0;

        if (monthFull.toLowerCase().equals(("janvier").toLowerCase())) {
            resI = 1;
        }
        if (monthFull.toLowerCase().equals(("février").toLowerCase())) {
            resI = 2;
        }
        if (monthFull.toLowerCase().equals(("fevrier").toLowerCase())) {
            resI = 2;
        }
        if (monthFull.toLowerCase().equals(("mars").toLowerCase())) {
            resI = 3;
        }
        if (monthFull.toLowerCase().equals(("avril").toLowerCase())) {
            resI = 4;
        }
        if (monthFull.toLowerCase().equals(("mai").toLowerCase())) {
            resI = 5;
        }
        if (monthFull.toLowerCase().equals(("juin").toLowerCase())) {
            resI = 6;
        }
        if (monthFull.toLowerCase().equals(("juillet").toLowerCase())) {
            resI = 7;
        }
        if (monthFull.toLowerCase().equals(("aout").toLowerCase())) {
            resI = 8;
        }
        if (monthFull.toLowerCase().equals(("août").toLowerCase())) {
            resI = 8;
        }
        if (monthFull.toLowerCase().equals(("septembre").toLowerCase())) {
            resI = 9;
        }
        if (monthFull.toLowerCase().equals(("octobre").toLowerCase())) {
            resI = 10;
        }
        if (monthFull.toLowerCase().equals(("novembre").toLowerCase())) {
            resI = 11;
        }
        if (monthFull.toLowerCase().equals(("décembre").toLowerCase())) {
            resI = 12;
        }
        if (monthFull.toLowerCase().equals(("decembre").toLowerCase())) {
            resI = 12;
        }
        return resI;
    }

    // Donne le nombre de jours entre deux dates, les dates étant passés en string
    public int spm_giveDifferenceJours(int jourDebut,
            int moisDebut,
            int anneeDebut,
            int jourFin,
            int moisFin,
            int anneeFin) {
        int resI = 0;
        long CONST_DURATION_OF_DAY = 1000l * 60 * 60 * 24;

        Calendar calendar1 = new GregorianCalendar();
        calendar1.set(Calendar.YEAR, anneeDebut);
        calendar1.set(Calendar.MONTH, moisDebut);
        calendar1.set(Calendar.DAY_OF_MONTH, jourDebut);
        Date date1 = calendar1.getTime();

        Calendar calendar2 = new GregorianCalendar();
        calendar2.set(Calendar.YEAR, anneeFin);
        calendar2.set(Calendar.MONTH, moisFin);
        calendar2.set(Calendar.DAY_OF_MONTH, jourFin);
        Date date2 = calendar2.getTime();

        long diff = Math.abs(date2.getTime() - date1.getTime());
        long numberOfDay = (long) diff / CONST_DURATION_OF_DAY;

        resI = (int) numberOfDay;
        System.out.println("Le nombre de jours est : " + resI);
        return resI;
    }
}
